/*
Automatic clinic tests using a robot arm.
Copyright (C) 2010  CIC-CPC, CHU Gabriel Montpied
All other trademarks, logos and copyrights are the property
of their respective owners.

This file is part of cpc-painbot.

cpc-painbot is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

cpc-painbot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with cpc-painbot.  If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef WIDGETBRAS_H
#define WIDGETBRAS_H

#include <QGraphicsScene>
#include <QWidget>

#include "Widgets_global.h"

namespace Ui {
    class WidgetBras;
}

class QProgressDialog;
class QTimer;

class Bras;
class PositionBras;
class BrasGraphique;
namespace commande {
    class Commande;
}

/*! Contrôles du Bras.
    Contrôles manuels du Bras, permettant de le déplacer selon le bon vouloir de l'utilisateur.
*/
class WIDGETSSHARED_EXPORT WidgetBras : public QWidget {
    Q_OBJECT
public:
    //! Constructeur.
    WidgetBras(QWidget *parent = 0);
    //! Destructeur.
    ~WidgetBras();

    Bras *bras() const { return bras_; }

protected:
    //! Gestion de la langue.
    void changeEvent(QEvent *e);

private slots:
    /*! Active/Désactive les éléments de controle.
        Selon la présence ou l'absence du bras, active/désactive les
        éléments d'interface permettant le contrôle du bras.
    */
    void brasPresent(bool etat);
    //void ledPrete() { ledAction(true); }
    //void ledAttente() { ledAction(false); }
    void ledPresence(bool present = false);
    void ledPrete(bool pret = false);

    /*! Actualise la position.
        Lorsque le bras change de position, l'affichage de celle-ci
        est rafraîchie.
    */
    void actualiserPosition(const PositionBras &pos);

    /*! Génère la liste des ports série.
        Récupère la liste des ports série disponibles sur le système
        et remplit la comboBox associée.
    */
    void genererListePorts();

    /*! Rotation de la tête.
        Lorsque la tête du bras a tourné.
    */
    void rotationTeteBras();

    /*! Déplace le bras suivant l'axe x.
        \param[in] sens Sens du déplacement.
    */
    void deplacerBrasX(int sens);

    /*! Déplace le bras suivant l'axe y.
        \param[in] sens Sens du déplacement.
    */
    void deplacerBrasY(int sens);

    /*! Déplace le bras suivant l'axe z.
        \param[in] sens Sens du déplacement.
    */
    void deplacerBrasZ(int sens);

    /*! Déplace le bras.
        Atteind les coordonnées données.
    */
    void deplacer(qreal x, qreal y, qreal z, qreal r);

    /*! Erreur de transmission.
        Lorsqu'une commande est émise, un timer est mis en place.
        Si celui-ci expire, c'est que le robot n'a pas répondu dans le temps
        imparti, traduisant une erreur.
    */
    void erreurTransmission();

    /*! Affichage d'erreur.
        Affiche une boîte de dialogue notifiant de l'erreur, en fonction de son type.
    */
    void afficherErreur(int type);

    //! Mise à jour du label de pas.
    void majLabelPas();

    //! Mise à jour du label de vitesse.
    void majLabelVitesse();

private:
    Ui::WidgetBras *ui;
    QProgressDialog *attente;
    QTimer *timer_attente;

    Bras *bras_;
    BrasGraphique *bras_graphique;
    QGraphicsScene scene_bras;
};

#endif // WIDGETBRAS_H
